package DeepClone;

import java.io.*;

/**
 * @Author Big_white
 * @Date 2021/10/31
 */
public class DeepProtoType implements Serializable,Cloneable {
    public String name; //String属性
    public DeepCloneableTarget deepCloneableTarget; //引用类型

    public DeepProtoType() {
    }

    //完成深拷贝的实现
    //方式一 使用clone

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object deep=null;
        //这里完成对基本数据类型和Stirng的克隆
        deep=super.clone();
        //对引用类型的属性，进行单独处理
        DeepProtoType deepProtoType=(DeepProtoType) deep;
        deepProtoType.deepCloneableTarget=(DeepCloneableTarget)deepCloneableTarget.clone();

        return deepProtoType;
    }

    //深拷贝-方式2 通过对象的序列化实现(推荐)
    public Object deepClone(){
        //创建流对象
        ByteArrayOutputStream bos=null;
        ObjectOutputStream oos=null;
        ByteArrayInputStream bis=null;
        ObjectInputStream ois=null;
        try {

            //序列化
            bos=new ByteArrayOutputStream();
            oos=new ObjectOutputStream(bos);
            //this当成一个整体进行处理
            oos.writeObject(this);//把当前这个对象以对象流的方式输出

            //反序列化
            bis=new ByteArrayInputStream(bos.toByteArray());
            ois=new ObjectInputStream(bis);
            DeepProtoType copyobj=(DeepProtoType) ois.readObject();
            return copyobj;
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }finally {
            //关闭流
            try {
                bos.close();
                oos.close();
                bis.close();
                ois.close();
            }catch (Exception e2){
                System.out.println(e2.getMessage());
            }
        }
    }
}
